local CommonOHOH = _G.CommonOHOH;
local M = CommonOHOH.class.new(script, CommonOHOH.files.CharacterObject(),script.Parent.Name.."_"..script.Name);
local ConnectClass=_G.CommonOHOH.load.Connect();
local ColliderGroup = CommonOHOH.load.ColliderGroup();
local ColliderManager = CommonOHOH.load.ColliderManager();
local StateMachine=CommonOHOH.load.StateMachine()

local Tool=CommonOHOH.load.MonsterTool()

function M.GetSizeIdByMid(id)
    return Tool.GetSizeIdByMId(id)
end

function M.GetSizeIdByCid(id)
    return M.GetSizeIdByMid("1_"..id)
end



function M.new(...)
	return M(...);
end;

function M.ctor(self,obj,battle)

    self.Guid=obj.Name --唯一Id
    self.Battle=battle --战斗对象
    self.DieEvent=ConnectClass.new() --死亡事件
    self.HurtEvent=ConnectClass.new()--受伤事件
    self.AttackEvent=ConnectClass.new()--攻击事件
    self.PauseEvent=ConnectClass.new() --怪物逻辑被暂停事件
    self.ContinueEvent=ConnectClass.new()-- 怪物逻辑继续事件,


    -- --初始化一个状态机
    -- self.StateMachine=StateMachine.new()
    --  --创建状态
    --  self.StateMachine:CreateState("idle")
    --  self.StateMachine:CreateState("follow")
    --  self.StateMachine:CreateState("attack")


    self.ChaseTargetEvent=ConnectClass.new()--追击目标事件
    self.ConList={} --存放所有监听
    M.super.ctor(self,obj);
    ColliderManager:SetAllGroup(self.main_inst, ColliderGroup.monster);
end;

--移除所有监听
function M.RemoveAllCon(self)
    for _,v in pairs(self.ConList) do
        v:Disconnect()
    end
    self.ConList={}
end


--析构函数
function M.dtor(self)
    -- print("---BB---怪物被销毁--guid---",self.Guid)

    
    self:RemoveAllCon()
    -- self.StateMachine:dtor()
    self.DieEvent:dtor()
    self.HurtEvent:dtor()
    self.PauseEvent:dtor()
    self.ContinueEvent:dtor()
    self.ChaseTargetEvent:dtor()
    self.AttackEvent:dtor()
	M.super.dtor(self);
end;


-- 获取状态
function M.GetState(self,id)
    return self.StateMachine:GetState(id)
end


-- 切换状态
function M.SwitchState(self,id)
    self.StateMachine:SwitchState(id)
end

--获取当前状态
function M.GetCurrentState(self)
    self.StateMachine:GetCurrentState()
end


--初始化非网络属性
function M.InitAttribute(self,drop,walkSpeed)
    self.Drop=drop --死亡掉落数据
    self.WalkSpeed=walkSpeed --移动速度
    self.SizeId=M.GetSizeIdByMid(self.attribute.MId)
    self:GetHumanoid().WalkSpeed=walkSpeed
end

-- 需要网络同步的属性（战斗过程中可能发生变化）
-- self:InitNetAttribute(levelId,cid,cfg.id,cfg.hp,cfg.hp,cfg.attack,attackCd)

function M.InitNetAttribute(self,levelId,cfgId,mid,hp,maxHp,damge,attackCd)

    self.attribute.Hp=hp -- 当前血量
    self.attribute.MaxHp=maxHp --总血量
    self.attribute.Damge=damge --当前攻击力
    self.attribute.AttackCd=attackCd --当前攻击cd
    self.attribute.CfgId=cfgId-- 刷怪索引
    self.attribute.LevelId=levelId-- 所在的关卡Id
    self.attribute.MId=mid-- 获取怪物配置ID
    self.attribute.IsCanAttack=false --能否被攻击
end


--打开移动
function M.OpenMove(self)
    self:GetHumanoid().WalkSpeed=self.WalkSpeed
end

--关闭移动
function M.CloseMove(self)
    self:GetHumanoid().WalkSpeed=0
end

--缩放移动速度
function M.ScaleMove(self,scale)
    self:GetHumanoid().WalkSpeed=scale*self.WalkSpeed
end


--获取怪物唯一Id
function M.GetGuid(self)
    return  self.Guid
end

--获取被攻击点位
function M.GetAttackPos(self)
    return self.main_inst.Touch.Position
end

--获取受伤特效点位
function M.GetHurtAtt(self)
    local root=self:GetRootPart_Loop()
   return root:FindFirstChild("HP")
end

--获取体积大小
function M.GetSizeId(self)
    return  self.SizeId
end

--获取头顶上的点
function M.GetHeadPos(self)
    return self.main_inst.Head.Position
end

--能否被攻击
function M.IsCanAttack(self)
    return self.attribute.IsCanAttack
end
-- 激活可被攻击
function M.ActiveAttack(self)
    self.attribute.IsCanAttack=true
end

--是否正在死亡中
function M.isDying(self)
    return  self.dying
end


function M.GetLevelId(self)

    return   self.attribute.LevelId
end




--被射中,延迟伤害，子弹到达时才产生伤害
function M.PushDamge(self,damge,attacker,waitEvent,bullet)
    if self:isDying() then
        return 
    end
    local con=waitEvent:Connect(function()
        self:Hurt(damge,attacker)
    end)
    table.insert(self.ConList,con)
end


-- 受到伤害 入参：伤害值，攻击者
function M.Hurt(self,damge,attacker)

    if self:isDying() then
        return 
    end

    if self.attribute.Hp==0 then
        return
    end
    self.attribute.Hp=self.attribute.Hp-damge
    if self.attribute.Hp<=0 then
        self.attribute.Hp=0
        self.HurtEvent:Action(damge,attacker,true)
        self:GoToDead()
    else
        self.HurtEvent:Action(damge,attacker)
    end
   
end

function M.GoToDead()


end


function M.Dead(self,attacker)
    if self:isDying() then
        return 
    end

    self.attribute.IsCanAttack=false
    
    self.dying=true

    local ts= self.DieEvent:Action(attacker)

    --计算销毁延迟时间（留给播死亡动画 等）
    local max=0
    for k,v in pairs(ts) do --取返回的最大值
         if v>max then
             max=v
         end
    end
 
    --通知客户端
    self.attribute.DeadTime=max
 
    --延迟销毁max秒
    if max>0 then
         self:AddProcess(function()
             self:Wait(max)
             self.dying=nil
             self:dtor()
         end)
     else
         self.dying=nil
         self:dtor()
    end

end



return M
